Visualización con Plotly
Contents
Visualización con Plotly¶
Vamos a dar un recorrido por algunas de las posibilidades de la librería de visualización Plotly. Recordamos que estos son algunos de los ejemplos, en la documentación puede encontrar mucho más! Si estan usando Jupyter Lab o Jupyter Notebooks para correr esta notebook, recomendamos antes, instalar Plotly con sus respectivas extensiones como indica aquí
Podemos hacer distintos tipos de gráficos, nosotros vamos a abordar los siguientes:
Objeto gráfico
Gráficos a partir de diccionarios
Plotly express
Datos¶
Vamos a usar un dataset de la Ciudad de Buenos Aires con información acerca de estaciones de subtes.
import pandas as pd
data = pd.read_csv('https://datasets-humai.s3.amazonaws.com/datasets/data_subtes.csv')
data.info()
data.isna().sum()
data.head()
| Unnamed: 0 | periodo | fecha | desde | hasta | linea | molinete | estacion | pax_pagos | pax_pases_pagos | pax_franq | total | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 8300 | 202001 | 2020-01-01 | 14:45:00 | 15:00:00 | LineaE | LineaE_Medalla_Turn01 | Medalla Milagrosa | 0.0 | 2.0 | 0.0 | 2.0 |
| 1 | 8297 | 202001 | 2020-01-01 | 12:15:00 | 12:30:00 | LineaH | LineaH_SantaFe_Norte_Turn04 | Santa Fe | 0.0 | 1.0 | 0.0 | 1.0 |
| 2 | 8298 | 202001 | 2020-01-01 | 12:15:00 | 12:30:00 | LineaH | LineaH_SantaFe_Sur_Turn01 | Santa Fe | 0.0 | 5.0 | 0.0 | 5.0 |
| 3 | 8299 | 202001 | 2020-01-01 | 12:15:00 | 12:30:00 | LineaD | LineaD_9Julio_S_Turn01 | 9 de julio | 0.0 | 1.0 | 0.0 | 1.0 |
| 4 | 8300 | 202001 | 2020-01-01 | 12:15:00 | 12:30:00 | LineaD | LineaD_Aguero_Turn02 | Agüero | 0.0 | 18.0 | 0.0 | 18.0 |
Vemos que el dataset es muy grande, por lo que nos vamos a quedar con una muestra.
import random
random.seed(7)
df = data.sample(frac=0.25)
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 750020 entries, 308760 to 604143
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Unnamed: 0 750020 non-null int64
1 periodo 750020 non-null int64
2 fecha 750020 non-null object
3 desde 750020 non-null object
4 hasta 750020 non-null object
5 linea 750020 non-null object
6 molinete 750020 non-null object
7 estacion 750020 non-null object
8 pax_pagos 750020 non-null float64
9 pax_pases_pagos 750020 non-null float64
10 pax_franq 750020 non-null float64
11 total 750020 non-null float64
dtypes: float64(4), int64(2), object(6)
memory usage: 74.4+ MB
Ahora sí, vemos que tenemos un dataset sin valores nulos y bien organizado, podemos seguir con los gráficos.
A partir de un diccionario¶
import plotly.io as pio
fig = dict({
"data": [{"type": "bar",
"x": df['linea'].value_counts().index.tolist(),
"y": df['linea'].value_counts()
}],
"layout": {"title": {"text": "Cantidad de observaciones por linea"}}
})
pio.show(fig)
/Users/mac/anaconda3/lib/python3.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning:
urllib3 (1.25.10) or chardet (3.0.4) doesn't match a supported version!
Dentro del mismo diccionario podemos personalizar nuestro gráfico de manera más detallada. Vemos como agregarle anotaciones y elegimos un tema de diseño.
fig = dict({
"data": [{"type": "bar",
"x": df['linea'].value_counts().index.tolist(),
"y": df['linea'].value_counts()
}],
"layout": {"title": {"text": "Cantidad de observaciones por linea"},
"template":"ggplot2",
'annotations':[dict(text="Es la más concurrida", x=0, y=180000),
dict(text="Es la menos concurrida", x=5, y=80000)],
'xaxis':{'title':'Lineas','color':'grey'},
'yaxis':{'title':'Frecuencia','color':'grey'}
}
})
pio.show(fig)
Plotly Express¶
Con plotly express podemos gozar de la calidad gráfica de plotly sin la necesidad de un código muy complejo.
Acomodomamos los formatos de las fechas.
df['desde'] = pd.to_datetime(df['desde'], format = '%H:%M:%S')
df['hasta'] = pd.to_datetime(df['hasta'], format = '%H:%M:%S')
df.hasta = df.hasta.apply(lambda x: x.strftime('%H:%M:%S'))
df.desde = df.desde.apply(lambda x: x.strftime('%H:%M:%S'))
df.fecha = pd.to_datetime(df['fecha'])
df['dia_semana'] = df['fecha'].apply(lambda x: x.day_name())
import plotly.express as px
template = 'ggplot2'
fig = px.histogram(df.sort_values(by='desde'),
x='desde', y="total",
template=template, title='Total de pasajeros por hora',
labels={'desde':'Horario','total':'Cantidad de pasajeros'})
fig.update_xaxes(rangeslider_visible=True)
fig.show()